package com.sunyard.layoutit.common;

import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Calendar;
import java.util.Date;

/**
 * @主题描述 日期工具类
 * @创建作者 耿道路
 * @创建时间 2016-6-7 15:58:18
 */
public final class DateUtil {

	private static SimpleDateFormat simple_date_format19 = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
	private static SimpleDateFormat simple_date_format14 = new SimpleDateFormat("yyyyMMddHHmmss");
	private static SimpleDateFormat simple_date_format10 = new SimpleDateFormat("yyyy-MM-dd");
	private static SimpleDateFormat simple_date_format8 = new SimpleDateFormat("yyyyMMdd");
	
	/**
	 * @功能描述 得到当前的日期和时间 返回的格式为:年-月-日 时:分:秒
	 * @返回信息 当前日期字符串 格式  (yyyyMMdd)
	 * @创建作者 耿道路
	 * @创建时间 2016-6-7 15:59:35
	 */
	public static String getMDrqzhsti8() {
		return simple_date_format8.format(new Date());
	}
	
	/**
	 * @功能描述 得到当前的日期和时间 返回的格式为:年-月-日 时:分:秒
	 * @返回信息 当前日期字符串 格式  (yyyy-MM-dd HH:mm:ss)
	 * @创建作者 耿道路
	 * @创建时间 2016-6-7 15:59:35
	 */
	public static String getMDrqzhsti19() {
		return simple_date_format19.format(new Date());
	}
	
	/**
	 * @功能描述 得到当前的日期和时间 返回的格式为:年-月-日 时:分:秒
	 * @返回信息 当前日期字符串 格式  (yyyyMMddHHmmss)
	 * @创建作者 耿道路
	 * @创建时间 2017-9-27 16:45:28
	 */
	public static String getMDrqzhsti14() {
		return simple_date_format14.format(new Date());
	}

	/**
	 * @功能描述 将字符串格式化为 yyyy-MM-dd HH:mm:ss 格式
	 * @参数信息 date 要格式化的日期对象
	 * @创建作者 耿道路
	 * @创建时间 2017-4-25 9:27:09
	 */
	public static String format19(Date date){
		return simple_date_format19.format(date);
	}
	
	/**
	 * @功能描述 将字符串格式化为 yyyyMMddHHmmss 格式
	 * @参数信息 date 要格式化的日期对象
	 * @创建作者 耿道路
	 * @创建时间 2017-8-30 9:37:47
	 */
	public static String format14(Date date){
		return simple_date_format14.format(date);
	}
	
	/**
	 * @功能描述 将字符串格式化为 yyyy-MM-dd格式
	 * @参数信息 date 要格式化的日期对象
	 * @创建作者 耿道路
	 * @创建时间 2017-6-28 18:26:45
	 */
	public static String format10(Date date){
		return simple_date_format10.format(date);
	}
	
	/**
	 * @功能描述 将字符串日期格式化为Date格式
	 * @参数信息 date
	 * @创建作者 耿道路
	 * @创建时间 2017-5-17 15:14:56
	 */
	public static Date format19(String source){
		try {
			return simple_date_format19.parse(source);
		} catch (ParseException e) {
			e.printStackTrace();
			throw new RuntimeException(e) ;
		}
	}
	
	/**
	 * @功能描述 将字符串格式化为 yyyyMMdd格式
	 * @参数信息 date 要格式化的日期对象
	 * @创建作者 耿道路
	 * @创建时间 2017-7-26 11:03:26
	 */
	public static String format8(Date date){
		return simple_date_format8.format(date);
	}
	

	/**
	 * @throws ParseException 
	 * @功能描述 将字符串参数转换成Date
	 * @参数信息 value 字符串格式日期
	 * @返回信息 日期Date
	 * @创建作者 耿道路
	 * @创建时间 2017-6-29 10:30:09
	 */
	public static Date parse(String value) throws ParseException {
		if(null == value || 0 == value.trim().length()){
			return null ;
		}
		value = value.trim() ;
		if(8 == value.length()){//yyyyMMdd
			return simple_date_format8.parse(value);
		}
		if(10 == value.length()){//yyyy-MM-dd
			return simple_date_format10.parse(value);
		}
		if(19 == value.length()){//yyyy-MM-dd HH:mm:ss
			return simple_date_format19.parse(value);
		}
		return null;
	}
	
	/**
	 * @功能描述 校验 yyyyMMdd 格式的日期
	 * @创建作者 耿道路
	 * @创建时间 2017-10-25 下午4:30:46
	 * @参考信息 http://www.cnblogs.com/yejg1212/archive/2013/05/28/3103960.html
	 */
	public static boolean validateDate8(String date){
		String reg_yyyyMMdd = "(([0-9]{3}[1-9]|[0-9]{2}[1-9][0-9]{1}|[0-9]{1}[1-9][0-9]{2}|[1-9][0-9]{3})(((0[13578]|1[02])(0[1-9]|[12][0-9]|3[01]))" +
                "|((0[469]|11)(0[1-9]|[12][0-9]|30))|(02(0[1-9]|[1][0-9]|2[0-8]))))" +
                "|((([0-9]{2})(0[48]|[2468][048]|[13579][26])|((0[48]|[2468][048]|[3579][26])00))0229)";
		return date.matches(reg_yyyyMMdd);
	}

	/**
	 * @功能描述 获取 yyyyMMdd 格式日期第二天日期
	 * @创建作者 耿道路
	 * @创建时间 2017-10-27 下午3:33:47
	 */
	public static String getTomorrow8(String value) {
		try {
			Date date = simple_date_format8.parse(value);
			Calendar cal = Calendar.getInstance();
			cal.setTime(date);
			cal.add(Calendar.DATE,1) ;
			Date tomorrow = cal.getTime();
			return simple_date_format8.format(tomorrow);
		} catch (ParseException e) {
			e.printStackTrace();
			return null;
		}
	}
	

	/**
	 * @功能描述 调整日期 ; n 为正整数时获取 date 后n天的数据 ; n 为负整数时获取 date 前n天的数据 , 
	 * @返回信息 当前日期字符串 格式  (yyyyMMdd)
	 * @创建作者 耿道路
	 * @创建时间 2016-6-7 15:59:35
	 */
	public static String adjustDay8(Date date,int n) {
		Calendar cal = Calendar.getInstance();
		cal.setTime(date);
		cal.add(Calendar.DATE,n) ;
		Date newDate = cal.getTime();
		return simple_date_format8.format(newDate);
	}
	

	/**
	 * @功能描述 将long格式日期格式化为 yyyy-MM-dd HH:mm:ss 格式
	 * @参数信息 time
	 * @创建作者 耿道路
	 * @创建时间 2018-8-21 17:00:40
	 */
	public static String format19(long time){
		return format19(new Date(time));
	}
}
